SportsClient copy 4.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. "use client";
  2. import { GameInfo } from "@/api/home";
  3. import { useRouter } from "@/i18n/routing";
  4. import { server } from "@/utils/client";
  5. import { useTranslations } from "next-intl";
  6. import Script from "next/script";
  7. import { FC, useEffect, useRef,useState } from "react";
  8. interface Props {
  9. brand_id: string;
  10. token: string;
  11. }
  12. // dedprz | deepwin365 | damslots | chips | deloro-casino
  13. const SportsClient: FC<Props> = (props) => {
  14. const t = useTranslations("ProfilePage");
  15. const { brand_id, token } = props;
  16. const [currentToken, setCurrentToken] = useState(token);
  17. const btRef = useRef(null);
  18. const router = useRouter();
  19. useEffect(() => {
  20. console.log("onLoad=====>0000");
  21. // @ts-ignore
  22. if (window.BTRenderer) {
  23. console.log("onLoad=====>1111");
  24. onLoad();
  25. }
  26. // 离开体育页的时候需要kill掉
  27. return () => {
  28. console.log("onLoad=====>killkillkillkillkill");
  29. // @ts-ignore
  30. btRef.current?.kill();
  31. };
  32. }, []);
  33. useEffect(() => {
  34. console.log("onLoad=====>22222");
  35. // 如果token更新了才调用update
  36. if( currentToken !== token){
  37. console.log("onLoad=====>333333");
  38. updateToken(token);
  39. }
  40. }, [token]);
  41. const getGameDetailApi = async () => {
  42. const data = await server
  43. .request<GameInfo>({
  44. url: "/v1/api/front/game_info_by_id",
  45. method: "post",
  46. data: { id: "sportsBet", mode: 1 },
  47. })
  48. .then((res) => {
  49. if (res.code === 200) {
  50. setCurrentToken(res.data.game_url)
  51. return res.data.game_url;
  52. } else {
  53. return "";
  54. }
  55. });
  56. return data;
  57. };
  58. const updateToken = (newToken: string) => {
  59. console.log("onLoad=====>44444-0000000");
  60. // @ts-ignore
  61. if(currentToken!== newToken){
  62. console.log("onLoad=====>44444");
  63. setCurrentToken(newToken);
  64. }
  65. // @ts-ignore
  66. // if (window.BTRenderer) {
  67. // onLoad();
  68. // }
  69. // 使用 updateOptions 更新当前的 BTRenderer 参数,而不是重新初始化
  70. if (btRef.current) {
  71. console.log("onLoad=====>55555");
  72. // 更新 token 和其他配置
  73. // @ts-ignore
  74. btRef.current.updateOptions({
  75. token: newToken, // 更新 token
  76. url: '/', // 更新 URL 或其他参数
  77. betSlipOffsetBottom: 80,
  78. betSlipZIndex: 1000,
  79. stickyTop: 0,
  80. betSlipOffsetTop: 50,
  81. });
  82. }
  83. }
  84. const onLoad = () => {
  85. // @ts-ignore
  86. const bt = new BTRenderer();
  87. btRef.current = bt;
  88. console.log("onLoad=====>666666",token);
  89. bt.initialize({
  90. brand_id: brand_id,
  91. token: token,//使用最新的token
  92. onTokenExpired: getGameDetailApi, //过期自动更新token
  93. onSessionRefresh: () => {
  94. // 销毁之前的实例并等待刷新完成
  95. if(btRef.current){
  96. // @ts-ignore
  97. btRef.current?.kill();
  98. }
  99. router.refresh()
  100. },
  101. themeName: "default",
  102. lang: "pt-br",
  103. target: document.getElementById("betby"),
  104. betSlipOffsetBottom: 80,
  105. // betSlipOffsetRight: 750,
  106. betSlipZIndex: 1000,
  107. stickyTop: 0,
  108. betSlipOffsetTop: 50,
  109. onRecharge: function () {
  110. router.push("/deposit");
  111. },
  112. onRouteChange: function () {
  113. },
  114. onLogin: function () {},
  115. onRegister: function () {},
  116. onBetSlipStateChange: function () {},
  117. });
  118. };
  119. return (
  120. <>
  121. <div id="betby" className={"h-[100%]"}></div>
  122. <Script src={"https://ui.invisiblesport.com/bt-renderer.min.js"} onLoad={onLoad} />
  123. </>
  124. );
  125. };
  126. export default SportsClient;